package edu.gdpu.memory.metaspace;

import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Opcodes;

/**
 * @author mazebin
 * @date 2021年 07月14日 17:43:10
 * http://www.blogjava.net/DLevin/archive/2014/06/25/414292.html
 * 元空间内存溢出测试（方法区内存溢出测试）
 * 元空间=方法区+堆
 *-XX:MetaspaceSize：表示metaspace首次使用不够而触发FGC的阈值，只对触发起作用；
 * -XX:MaxMetaspaceSize：用于设置metaspace区域的最大值。
 */
public class MetaSpaceOutOfMemoryErrorTest1 extends ClassLoader {
    public static void main(String[] args) {
        int j=0;
        try{
            MetaSpaceOutOfMemoryErrorTest1 errorTest1 = new MetaSpaceOutOfMemoryErrorTest1();
            for (int i = 0; i < 10000; i++,j++) {
                //ClassVisitor:定义在读取Class字节码时会触发的事件，如类头解析完成、注解解析、字段解析、方法解析等。
                //ClassWriter实现了ClassVisitor,作用是生成类的二进制字节码
                ClassWriter cw = new ClassWriter(0);
                //版本号,public ,类名，包名，父类，接口
                cw.visit(Opcodes.V1_8,Opcodes.ACC_PUBLIC,"Class"+i,null,"java/lang/Object",null);
                //返回字节数组
                byte[] bytes = cw.toByteArray();
                //加载类
                errorTest1.defineClass("Class"+i,bytes,0,bytes.length);
            }

        }finally {
            System.out.println(j);
        }
    }
    /**
     * 结果：
     * Error occurred during initialization of VM
     * MaxMetaspaceSize is too small.
     */
}
